{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Install TensorTrade"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Obtaining file:///Users/adam/Desktop/Capfolio/tensortrade\n",
      "Requirement already satisfied, skipping upgrade: numpy==1.16.4 in /usr/local/lib/python3.7/site-packages (from tensortrade==0.2.0b0) (1.16.4)\n",
      "Requirement already satisfied, skipping upgrade: pandas==0.25.0 in /usr/local/lib/python3.7/site-packages (from tensortrade==0.2.0b0) (0.25.0)\n",
      "Requirement already satisfied, skipping upgrade: gym==0.14.0 in /usr/local/lib/python3.7/site-packages (from tensortrade==0.2.0b0) (0.14.0)\n",
      "Requirement already satisfied, skipping upgrade: pyyaml==5.1.2 in /usr/local/lib/python3.7/site-packages (from tensortrade==0.2.0b0) (5.1.2)\n",
      "Requirement already satisfied, skipping upgrade: sympy==1.4 in /usr/local/lib/python3.7/site-packages (from tensortrade==0.2.0b0) (1.4)\n",
      "Requirement already satisfied, skipping upgrade: pytz>=2017.2 in /usr/local/lib/python3.7/site-packages (from pandas==0.25.0->tensortrade==0.2.0b0) (2019.2)\n",
      "Requirement already satisfied, skipping upgrade: python-dateutil>=2.6.1 in /usr/local/Cellar/jupyterlab/1.0.0_5/libexec/vendor/lib/python3.7/site-packages (from pandas==0.25.0->tensortrade==0.2.0b0) (2.7.3)\n",
      "Requirement already satisfied, skipping upgrade: pyglet<=1.3.2,>=1.2.0 in /usr/local/lib/python3.7/site-packages (from gym==0.14.0->tensortrade==0.2.0b0) (1.3.2)\n",
      "Requirement already satisfied, skipping upgrade: cloudpickle~=1.2.0 in /usr/local/lib/python3.7/site-packages (from gym==0.14.0->tensortrade==0.2.0b0) (1.2.1)\n",
      "Requirement already satisfied, skipping upgrade: scipy in /usr/local/lib/python3.7/site-packages (from gym==0.14.0->tensortrade==0.2.0b0) (1.4.1)\n",
      "Requirement already satisfied, skipping upgrade: six in /usr/local/Cellar/jupyterlab/1.0.0_5/libexec/vendor/lib/python3.7/site-packages (from gym==0.14.0->tensortrade==0.2.0b0) (1.11.0)\n",
      "Requirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.7/site-packages (from sympy==1.4->tensortrade==0.2.0b0) (1.1.0)\n",
      "Requirement already satisfied, skipping upgrade: future in /usr/local/lib/python3.7/site-packages (from pyglet<=1.3.2,>=1.2.0->gym==0.14.0->tensortrade==0.2.0b0) (0.17.1)\n",
      "Installing collected packages: tensortrade\n",
      "  Attempting uninstall: tensortrade\n",
      "    Found existing installation: TensorTrade 0.2.0b0\n",
      "    Uninstalling TensorTrade-0.2.0b0:\n",
      "      Successfully uninstalled TensorTrade-0.2.0b0\n",
      "  Running setup.py develop for tensortrade\n",
      "Successfully installed tensortrade\n"
     ]
    }
   ],
   "source": [
    "!python3 -m pip install -e .. -U"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup Data Fetching"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import ssl\n",
    "import pandas as pd\n",
    "\n",
    "ssl._create_default_https_context = ssl._create_unverified_context # Only used if pandas gives a SSLError\n",
    "\n",
    "def fetch(exchange_name, symbol, timeframe):\n",
    "    url = \"https://www.cryptodatadownload.com/cdd/\"\n",
    "    filename = \"{}_{}USD_{}.csv\".format(exchange_name, symbol, timeframe)\n",
    "    volume_column = \"Volume {}\".format(symbol)\n",
    "    new_volume_column = \"Volume_{}\".format(symbol)\n",
    "    \n",
    "    df = pd.read_csv(url + filename, skiprows=1)\n",
    "    df = df[::-1]\n",
    "    df = df.drop([\"Symbol\"], axis=1)\n",
    "    df = df.rename({\"Volume USD\": \"volume\", volume_column: new_volume_column}, axis=1)\n",
    "    df = df.set_index(\"Date\")\n",
    "    df.columns = [symbol + \":\" + name.lower() for name in df.columns]\n",
    "                     \n",
    "    return df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup Trading Environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensortrade.exchanges import Exchange\n",
    "from tensortrade.exchanges.services.execution.simulated import execute_order\n",
    "from tensortrade.data import Stream, DataFeed, Module\n",
    "from tensortrade.instruments import USD, BTC, ETH, LTC\n",
    "from tensortrade.wallets import Wallet, Portfolio\n",
    "from tensortrade.environments import TradingEnvironment\n",
    "\n",
    "coinbase_data = pd.concat([\n",
    "    fetch(\"Coinbase\", \"BTC\", \"1h\"),\n",
    "    fetch(\"Coinbase\", \"ETH\", \"1h\")\n",
    "], axis=1)\n",
    "\n",
    "coinbase = Exchange(\"coinbase\", service=execute_order)(\n",
    "    Stream(\"USD-BTC\", list(coinbase_data['BTC:close'])),\n",
    "    Stream(\"USD-ETH\", list(coinbase_data['ETH:close']))\n",
    ")\n",
    "\n",
    "coinbase_btc = coinbase_data.loc[:, [name.startswith(\"BTC\") for name in coinbase_data.columns]]\n",
    "\n",
    "with Module(\"coinbase\") as coinbase_ns:\n",
    "    nodes = [Stream(name, list(coinbase_data[name])) for name in coinbase_data.columns]\n",
    "\n",
    "feed = DataFeed([coinbase_ns])\n",
    "\n",
    "portfolio = Portfolio(USD, [\n",
    "    Wallet(coinbase, 10000 * USD),\n",
    "    Wallet(coinbase, 10 * BTC),\n",
    "    Wallet(coinbase, 5 * ETH),\n",
    "])\n",
    "\n",
    "env = TradingEnvironment(\n",
    "    feed=feed,\n",
    "    portfolio=portfolio,\n",
    "    action_scheme='managed-risk',\n",
    "    reward_scheme='risk-adjusted',\n",
    "    window_size=20\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example Data Feed Observation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'coinbase:/USD:/total': 10000,\n",
       " 'coinbase:/BTC:high': 2513.38,\n",
       " 'coinbase:/BTC:/free': 10,\n",
       " 'coinbase:/BTC:low': 2495.12,\n",
       " 'coinbase:/USD:/free': 10000,\n",
       " 'coinbase:/BTC:/locked': 0,\n",
       " 'coinbase:/BTC:close': 2509.17,\n",
       " 'coinbase:/BTC:volume_btc': 114.6,\n",
       " 'coinbase:/BTC:/total': 10,\n",
       " 'coinbase:/ETH:close': 275.01,\n",
       " 'coinbase:/USD-BTC': 2509.17,\n",
       " 'coinbase:/BTC:/worth': 25091.7,\n",
       " 'coinbase:/BTC:volume': 287000.32,\n",
       " 'coinbase:/ETH:open': 279.98,\n",
       " 'coinbase:/USD-ETH': 275.01,\n",
       " 'coinbase:/BTC:open': 2505.56,\n",
       " 'coinbase:/ETH:high': 279.99,\n",
       " 'coinbase:/ETH:low': 272.1,\n",
       " 'coinbase:/ETH:/locked': 0,\n",
       " 'coinbase:/ETH:/free': 5,\n",
       " 'coinbase:/ETH:volume_eth': 2455.28,\n",
       " 'coinbase:/ETH:/total': 5,\n",
       " 'coinbase:/USD:/locked': 0,\n",
       " 'coinbase:/ETH:volume': 679358.87,\n",
       " 'coinbase:/ETH:/worth': 1375.05,\n",
       " 'net_worth': 36466.75}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "env.feed.next()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup and Train DQN Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====      EPISODE ID: eb726f14-9b6a-46be-a069-c79b007ff909      ====\n"
     ]
    }
   ],
   "source": [
    "from tensortrade.agents import DQNAgent\n",
    "\n",
    "agent = DQNAgent(env)\n",
    "\n",
    "agent.train(n_steps=200, save_path=\"examples/agents/\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot Performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x14eeb2f10>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "portfolio.performance.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x151022fd0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "portfolio.performance.net_worth.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup and Train A2C Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====      EPISODE ID: 75731cea-092a-4475-8f6c-b787343bfbd9      ====\n"
     ]
    },
    {
     "ename": "InvalidArgumentError",
     "evalue": "Can not squeeze dim[1], expected a dimension of 1, got 128 [Op:Squeeze]",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mInvalidArgumentError\u001b[0m                      Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-8-f981051a1cf6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0magent\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mA2CAgent\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0magent\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_steps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m200\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msave_path\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"examples/agents/\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/Desktop/Capfolio/tensortrade/tensortrade/agents/a2c_agent.py\u001b[0m in \u001b[0;36mtrain\u001b[0;34m(self, n_steps, n_episodes, save_every, save_path, callback, **kwargs)\u001b[0m\n\u001b[1;32m    200\u001b[0m                                              \u001b[0mlearning_rate\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    201\u001b[0m                                              \u001b[0mdiscount_factor\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 202\u001b[0;31m                                              entropy_c)\n\u001b[0m\u001b[1;32m    203\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    204\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mn_steps\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0msteps_done\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0mn_steps\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Desktop/Capfolio/tensortrade/tensortrade/agents/a2c_agent.py\u001b[0m in \u001b[0;36m_apply_gradient_descent\u001b[0;34m(self, memory, batch_size, learning_rate, discount_factor, entropy_c)\u001b[0m\n\u001b[1;32m    139\u001b[0m             \u001b[0mactions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mint32\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    140\u001b[0m             \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactor_network\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstates\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 141\u001b[0;31m             \u001b[0mpolicy_loss_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwsce_loss\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogits\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0madvantages\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    143\u001b[0m             \u001b[0mprobs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msoftmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlogits\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/keras/losses.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, y_true, y_pred, sample_weight)\u001b[0m\n\u001b[1;32m    126\u001b[0m       \u001b[0mlosses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_pred\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    127\u001b[0m       return losses_utils.compute_weighted_loss(\n\u001b[0;32m--> 128\u001b[0;31m           losses, sample_weight, reduction=self._get_reduction())\n\u001b[0m\u001b[1;32m    129\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    130\u001b[0m   \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/keras/utils/losses_utils.py\u001b[0m in \u001b[0;36mcompute_weighted_loss\u001b[0;34m(losses, sample_weight, reduction, name)\u001b[0m\n\u001b[1;32m    105\u001b[0m     \u001b[0minput_dtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlosses\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m     weighted_losses = tf_losses_utils.scale_losses_by_sample_weight(\n\u001b[0;32m--> 107\u001b[0;31m         losses, sample_weight)\n\u001b[0m\u001b[1;32m    108\u001b[0m     \u001b[0;31m# Apply reduction function to the individual weighted losses.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    109\u001b[0m     \u001b[0mloss\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreduce_weighted_loss\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweighted_losses\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreduction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/losses/util.py\u001b[0m in \u001b[0;36mscale_losses_by_sample_weight\u001b[0;34m(losses, sample_weight)\u001b[0m\n\u001b[1;32m    143\u001b[0m   \u001b[0;31m# Update dimensions of `sample_weight` to match with `losses` if possible.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    144\u001b[0m   losses, _, sample_weight = squeeze_or_expand_dimensions(\n\u001b[0;32m--> 145\u001b[0;31m       losses, None, sample_weight)\n\u001b[0m\u001b[1;32m    146\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    147\u001b[0m   \u001b[0;31m# Broadcast weights if possible.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/losses/util.py\u001b[0m in \u001b[0;36msqueeze_or_expand_dimensions\u001b[0;34m(y_pred, y_true, sample_weight)\u001b[0m\n\u001b[1;32m     95\u001b[0m     \u001b[0;31m# Use static rank.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     96\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mweights_rank\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0my_pred_rank\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 97\u001b[0;31m       \u001b[0msample_weight\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marray_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqueeze\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     98\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0my_pred_rank\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mweights_rank\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     99\u001b[0m       \u001b[0msample_weight\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marray_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpand_dims\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/util/dispatch.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    178\u001b[0m     \u001b[0;34m\"\"\"Call target, and fall back on dispatchers if there is a TypeError.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    179\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 180\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mtarget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    181\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mTypeError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    182\u001b[0m       \u001b[0;31m# Note: convert_to_eager_tensor currently raises a ValueError, not a\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/util/deprecation.py\u001b[0m in \u001b[0;36mnew_func\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    505\u001b[0m                 \u001b[0;34m'in a future version'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdate\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'after %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mdate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    506\u001b[0m                 instructions)\n\u001b[0;32m--> 507\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    508\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    509\u001b[0m     doc = _add_deprecated_arg_notice_to_docstring(\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/array_ops.py\u001b[0m in \u001b[0;36msqueeze\u001b[0;34m(input, axis, name, squeeze_dims)\u001b[0m\n\u001b[1;32m   3778\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misscalar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3779\u001b[0m     \u001b[0maxis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3780\u001b[0;31m   \u001b[0;32mreturn\u001b[0m \u001b[0mgen_array_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqueeze\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   3781\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3782\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/ops/gen_array_ops.py\u001b[0m in \u001b[0;36msqueeze\u001b[0;34m(input, axis, name)\u001b[0m\n\u001b[1;32m   9219\u001b[0m         \u001b[0;32mpass\u001b[0m  \u001b[0;31m# Add nodes to the TensorFlow graph.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   9220\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0m_core\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 9221\u001b[0;31m       \u001b[0m_ops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_from_not_ok_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   9222\u001b[0m   \u001b[0;31m# Add nodes to the TensorFlow graph.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   9223\u001b[0m   \u001b[0;32mif\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py\u001b[0m in \u001b[0;36mraise_from_not_ok_status\u001b[0;34m(e, name)\u001b[0m\n\u001b[1;32m   6604\u001b[0m   \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\" name: \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   6605\u001b[0m   \u001b[0;31m# pylint: disable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 6606\u001b[0;31m   \u001b[0msix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_status_to_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   6607\u001b[0m   \u001b[0;31m# pylint: enable=protected-access\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   6608\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/Cellar/jupyter/1.0.0_5/libexec/vendor/lib/python3.7/site-packages/six.py\u001b[0m in \u001b[0;36mraise_from\u001b[0;34m(value, from_value)\u001b[0m\n",
      "\u001b[0;31mInvalidArgumentError\u001b[0m: Can not squeeze dim[1], expected a dimension of 1, got 128 [Op:Squeeze]"
     ]
    }
   ],
   "source": [
    "from tensortrade.agents import A2CAgent\n",
    "\n",
    "agent = A2CAgent(env)\n",
    "\n",
    "agent.train(n_steps=200, save_path=\"examples/agents/\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "portfolio.performance.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "portfolio.performance.net_worth.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup and Train Parallel DQN Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====      EPISODE ID (0/2147483647): 0a15a273-c1e9-4f8e-9a50-6ea95795b484      ====\n",
      "====      EPISODE ID (0/2147483647): d311dbdc-33d7-4704-b394-9468481e8c68      ====\n",
      "====      EPISODE ID (0/2147483647): 9bca0f01-925f-4e73-86eb-c91ba8f9d20c      ====\n",
      "====      EPISODE ID (0/2147483647): 3d12e8dd-674e-45c9-9009-59ab235342af      ====\n"
     ]
    }
   ],
   "source": [
    "from tensortrade.agents import ParallelDQNAgent\n",
    "\n",
    "def create_env():\n",
    "    feed = DataFeed([coinbase_ns])\n",
    "\n",
    "    portfolio = Portfolio(USD, [\n",
    "        Wallet(coinbase, 10000 * USD),\n",
    "        Wallet(coinbase, 10 * BTC),\n",
    "        Wallet(coinbase, 5 * ETH),\n",
    "    ])\n",
    "    \n",
    "    env = TradingEnvironment(\n",
    "        feed=feed,\n",
    "        portfolio=portfolio,\n",
    "        action_scheme='managed-risk',\n",
    "        reward_scheme='risk-adjusted',\n",
    "        window_size=20\n",
    "    )\n",
    "    \n",
    "    return env\n",
    "\n",
    "agent = ParallelDQNAgent(create_env)\n",
    "\n",
    "agent.train(n_envs=4, n_steps=200, save_path=\"examples/agents/\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
